home *** CD-ROM | disk | FTP | other *** search
/ Gekikoh Dennoh Club 2 / Gekikoh Dennoh Club Vol. 2 (Japan).7z / Gekikoh Dennoh Club Vol. 2 (Japan) (Track 01).bin / tools / 8adp / 8adpcm.c < prev    next >
Text File  |  1997-10-13  |  3KB  |  183 lines

  1. #include    <stdio.h>
  2. #include    <stdlib.h>
  3.  
  4. #define        UNchar        unsigned char
  5. #define        UNshort        unsigned short
  6. #define        UNint        unsigned int
  7. #define        UNlong        unsigned long
  8.  
  9. void    PCM2AP8_INIT();
  10. void    AP82PCM_INIT();
  11. UNlong    PCM2AP8( short*,UNchar*,UNlong );
  12. UNlong    AP82PCM( UNchar*,short*,UNlong );
  13. inline UNchar PCM2AP8_SUB( long );
  14. inline short AP82PCM_SUB(UNchar );
  15.  
  16. static    long    P2A_lxn1,P2A_rxn1;
  17. static    long    P2A_ldln,P2A_rdln;
  18. static    long    A2P_lxn1,A2P_rxn1;
  19. static    long    A2P_ldln,A2P_rdln;
  20. static    long    f[7+1]={57,57,57,57,77,102,128,153};
  21. static    long    xn1;
  22. static    long    dln;
  23.  
  24. #define        dsc    (256)
  25. #define        lw    (128*dsc)
  26. #define        lk    (64*dsc)
  27. #define        dmin    (127*dsc)
  28. #define        dmax    (24576*dsc)
  29.  
  30.  
  31. /*==============================================================*/
  32. void    PCM2AP8_INIT()
  33. {
  34. P2A_lxn1=0;
  35. P2A_rxn1=0;
  36. P2A_ldln=dmin;
  37. P2A_rdln=dmin;
  38. }
  39. /*+++++++++*/
  40. UNlong    PCM2AP8(pbuff,abuff,ll)
  41. short* pbuff;
  42. UNchar*    abuff;
  43. UNlong    ll;            /// byte 数
  44. {
  45. long    xn;
  46. UNlong    l_=ll;
  47. ll/=4;
  48. for(;ll>0;ll--){
  49.     //=== LEFT
  50.     xn=(long)(short)*pbuff++; 
  51.     xn1 = P2A_lxn1;
  52.     dln = P2A_ldln;
  53.     *abuff++=PCM2AP8_SUB(xn);
  54.     P2A_lxn1 = xn1;
  55.     P2A_ldln = dln;
  56.     //=== RIGHT
  57.     xn=(long)(short)*pbuff++;
  58.     xn1=P2A_rxn1;
  59.     dln=P2A_rdln;
  60.     *abuff++=PCM2AP8_SUB(xn);
  61.     P2A_rxn1=xn1;
  62.     P2A_rdln=dln;
  63. }
  64. return(l_/2);
  65. }
  66. /*+++++*/
  67. inline UNchar PCM2AP8_SUB(long xn)
  68. {
  69. UNchar    adp;
  70.  
  71. long    dn;
  72. long    oxn;
  73. long    la;
  74. long    ld;
  75. do {
  76.     dn=xn-xn1;
  77.     la=abs(dn)*lk/dln;
  78.     if ( la>127 ) {
  79.         la=127;
  80.         /* adp …adpcmデータ*/
  81.     }
  82.     if ( dn>=0 ) {
  83.         adp=la;
  84.         ld=((la*2+1)*dln)/lw;
  85.     }
  86.     else {
  87.         adp=(la | 128);
  88.         ld=-((la*2+1)*dln)/lw;
  89.     }
  90.     oxn=xn;
  91.     /* 実際に展開して同値になるまでループ*/
  92.     xn=xn1+ld;
  93.     if ( xn>32767 )
  94.         xn=32767;
  95.     if ( xn<-32768 )
  96.         xn=-32768;
  97. } while (!(xn==oxn));
  98. /* 予測値(xn1)・量子化幅(dln)の更新*/
  99. xn1=xn+ld;
  100. dln=(f[la/16]*dln)/64;
  101. if ( dln<dmin )
  102.     dln=dmin;
  103. if ( dln>dmax )
  104.     dln=dmax;
  105. return(adp);
  106. }
  107. /*==============================================================*/
  108. void    AP82PCM_INIT()
  109. {
  110. int    i;
  111. A2P_lxn1=0;
  112. A2P_rxn1=0;
  113. A2P_ldln=dmin;
  114. A2P_rdln=dmin;
  115. }
  116. /*+++++++++*/
  117. UNlong    AP82PCM(abuff,pbuff,ll)
  118. UNchar*    abuff;
  119. short* pbuff;
  120. UNlong    ll;        // byte 数
  121. {
  122. int    adp;
  123. short    c;
  124. UNlong    l_=ll;
  125. ll/=2;
  126. for(;ll>0;ll--){
  127.     //=== LEFT
  128.     adp=*abuff++;
  129.     xn1 = A2P_lxn1;
  130.     dln = A2P_ldln;
  131.     *pbuff++=AP82PCM_SUB(adp);
  132.     A2P_lxn1 = xn1;
  133.     A2P_ldln = dln;
  134.     //=== RIGHT
  135.     adp=*abuff++;
  136.     xn1 = A2P_rxn1;
  137.     dln = A2P_rdln;
  138.     *pbuff++=AP82PCM_SUB(adp);
  139.     A2P_rxn1 = xn1;
  140.     A2P_rdln = dln;
  141. }
  142. return(l_*2);
  143. }
  144. /*++++++++++++++++++++++*/
  145. inline short AP82PCM_SUB(UNchar adp)
  146. {
  147. long    xn;
  148. long    ld;
  149. UNchar    la;
  150. if ( adp>127 ) {
  151.     la=adp-128;
  152.     ld=-((la*2+1)*dln)/lw;
  153. }
  154. else {
  155.     la=adp;
  156.     ld=((la*2+1)*dln)/lw;
  157. }
  158. xn=xn1+ld;
  159. if ( xn>32767 ) {
  160.     xn=32767;
  161. }
  162. if ( xn<-32768 ) {
  163.     xn=-32768;
  164. }
  165. /* 予測値(xn1)・量子化幅(dln)の更新*/
  166. xn1=xn+ld;
  167. /* ←ここ変更!!!*/
  168. dln=(f[la/16]*dln)/64;
  169. /* ←ここ変更!!!*/
  170. if ( dln<dmin ) {
  171.     dln=dmin;
  172. }
  173. if ( dln>dmax ) {
  174.     dln=dmax;
  175. }
  176.  
  177.  
  178.  
  179.  
  180.  
  181. return(xn);
  182. }
  183.